package br.com.arquitetura.main;

import java.util.ArrayList;
import java.util.List;

import br.com.arquitetura.componente.Flag;
import br.com.arquitetura.componente.Memoria;
import br.com.arquitetura.componente.Multiplexador;
import br.com.arquitetura.componente.Processador;
import br.com.arquitetura.componente.Registrador;
import br.com.arquitetura.componente.UnidadeControle;
import br.com.arquitetura.componente.UnidadeLogicaAritmetica;
import br.com.arquitetura.controle.Controle;
import br.com.arquitetura.parser.Parser;
import br.com.arquitetura.visual.MainWindow;

public class Main {
	
	public static final int PONTOS_CONTROLE_ULA = 5;
	
	public static final int TAMAMHO_MEMORIA = 65536;
	
	public static final String ARQUIVO = "arquivo.txt";
	
	
	
	public static void main (String args[]) {
		Flag f = new Flag(false, UnidadeLogicaAritmetica.FLAG_CARRY);
		Flag f1 = new Flag(false, UnidadeLogicaAritmetica.FLAG_NEGATIVO);
		Flag f2 = new Flag(false, UnidadeLogicaAritmetica.FLAG_ZERO);
		
		List<Flag> flags = new ArrayList<Flag>();
		flags.add(f);
		flags.add(f1);
		flags.add(f2);
		 
		UnidadeLogicaAritmetica ula = new UnidadeLogicaAritmetica(PONTOS_CONTROLE_ULA, flags);
		
		UnidadeControle uc = new UnidadeControle();
		
		Registrador iR = new Registrador(Processador.IR);
		Registrador pC = new Registrador(Processador.PC);
		Registrador rDados = new Registrador(Processador.RDADOS);
		Registrador rEndereco = new Registrador(Processador.REND);
		Registrador r0 = new Registrador(Processador.R0);
		Registrador r1 = new Registrador(Processador.R1);
		Registrador r2 = new Registrador(Processador.R2);
		Registrador r3 = new Registrador(Processador.R3);
		Registrador r4 = new Registrador(Processador.R4);
		Registrador rA = new Registrador(Processador.RA);
		Registrador rB = new Registrador(Processador.RB);
		
		
		List<Registrador> registradores = new ArrayList<Registrador>();
		registradores.add(rDados);
		registradores.add(rEndereco);
		registradores.add(rB);
		registradores.add(rA);
		registradores.add(r4);
		registradores.add(r3);
		registradores.add(r2);
		registradores.add(r1);
		registradores.add(r0);
		registradores.add(iR);
		registradores.add(pC);
		
        Memoria memoria = new Memoria(TAMAMHO_MEMORIA);
        
        Multiplexador multA = new Multiplexador(1);
        Multiplexador multB = new Multiplexador(2);
        Multiplexador multC = new Multiplexador(3);
        
        List<Multiplexador> multiplexadores = new ArrayList<Multiplexador>();
        multiplexadores.add(multA);
        multiplexadores.add(multB);
        multiplexadores.add(multC);
        
        Processador processador = new Processador(registradores, multiplexadores, uc, ula);
        
        Parser parser = new Parser();
        
        MainWindow mainWindow = new MainWindow();
        
        Controle controle = new Controle(processador, mainWindow, memoria, parser);
        
        controle.init();   
	}

}
